package 网络编程.课后作业;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 4)、使用TCP协议实现客户端上传文件到服务器，服务器接收到文件将其保存到指定目录中，
 * 要求服务器可以处理多个客户端上传请求？字节流
 */
public class M4 {
    public static void main(String[] args) throws IOException {

        //创建客户端
        Socket socket = new Socket("127.0.0.1",8888);

        //创建客户端本地输入流，从客户本地获取要上传的文件
        FileInputStream fis = new FileInputStream("timg.jpg");
        //获取网络输出字节流，从而向服务器端发送数据
        OutputStream os = socket.getOutputStream();

        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = fis.read(bytes))!=-1){
            //向服务器端发送文件
            os.write(bytes,0,len);
        }
        //关闭客户端输出流，中断上传
        socket.shutdownOutput();

        //获取网络字节输入流，从而获取服务器端传来的数据
        InputStream is = socket.getInputStream();

        while ((len=is.read(bytes))!=-1){
            //输入从服务器端获取的数据："上传成功"
            System.out.println(new String(bytes,0,len));
        }

        //关闭客户端
        socket.close();
    }
}

class TCPServer{
    public static void main(String[] args) throws IOException {

        //创建服务器端
        ServerSocket serverSocket = new ServerSocket(8888);

        while (true){
            //获取客户端对象
            Socket socket = serverSocket.accept();

            //创建服务器端输出流，从而把从客户端获得的文件保存到服务器本地，并且重新命名
            FileOutputStream fos = new FileOutputStream("upload"+System.currentTimeMillis());
            //获取网络输出字节流，从而向客户端发送数据
            InputStream inputStream = socket.getInputStream();

            int len = 0;
            byte[] bytes = new byte[1024];
            while ((len=inputStream.read(bytes))!=-1){
                //保存从客户端收到的文件
                fos.write(bytes,0,len);
            }

            //获取网络输出字节流，从而向客户端发送数据
            OutputStream outputStream = socket.getOutputStream();

            //向客户端发送信息："上传成功1"
            outputStream.write("上传成功".getBytes());

            //关闭客户端
            socket.close();
        }
    }
}
